#ifndef MESSAGESHOWAREA_H
#define MESSAGESHOWAREA_H

#include"model/data.h"


#include <QScrollArea>
#include <QWidget>
#include<QLabel>
#include<QPushButton>

//////////////////////////////////////////////////
////// 消息展示区
//////////////////////////////////////////////////
class MessageShowArea : public QScrollArea
{
    Q_OBJECT
public:
    MessageShowArea();

    //尾插
    void BackaddWidget(bool isLeft, const model::Message& message);
    //头插
    void FontaddWidget(bool isLeft, const model::Message& message);
    //清空消息
    void clear();
    //滚动到末尾
    void scrollToEnd();

private:
    QWidget* container;
};

//////////////////////////////////////////////////
////// 表示一个消息元素
////// 这个里面要能同时支持文本消息，图片消息，文件消息，语音消息，
////// 当前先只考虑文本消息，另外的几个后续添加
//////////////////////////////////////////////////
class MessageItem : public QWidget
{
    Q_OBJECT
public:
    MessageItem(bool isleft);

    //消息样式有多种，使用工厂模式构建
    static MessageItem* makeMessageItem(bool isleft , const model::Message& message);

    //工厂方法创建MessageItem
    static QWidget* makeSpeechMessageItem(bool isLeft,const model::Message& message);
    static QWidget* makeImageMessageItem(bool isLeft,const QString& fileId,const QByteArray& content);
    static QWidget* makeFileMessageItem(bool isLeft,const model::Message& message);
    static QWidget* makeTextMessageItem(bool isLeft , const QString& text);

private:
    //记录该消息是否应该在左侧
    bool isLeft;
};


//////////////////////////////////////////////////
////// 创建类表示"文本消息"正文部分
//////	也让这个类表示"文件消息"
//////////////////////////////////////////////////

class MessageContentLabel : public QWidget{
    Q_OBJECT
public:
    MessageContentLabel(const QString& text, bool isLeft,model::MessageType messageType,const QString& fileId,
                        const QByteArray& content);

    void paintEvent(QPaintEvent* event) override;
    void mousePressEvent(QMouseEvent* event) override;

    void updateUI(const QString& fileId,const QByteArray& fileContent);
    void saveAsFile(const QByteArray& content);

    void playDone();
    void contextMenuEvent(QContextMenuEvent* event)override;
    void speechConvertTextDone(const QString& fileId,const QString& text);

private:
    QLabel* label;
    bool isLeft;

    model::MessageType messageType;
    QString fileId;
    QByteArray content;

    bool loadContentDone = false;
};

//////////////////////////////////////////////////
////// 创建类表示"文本消息"正文部分
//////////////////////////////////////////////////

class MessageImageLabel : public QWidget{
    Q_OBJECT;

public:
    MessageImageLabel(const QString& fileId,const QByteArray& content,bool isLeft);

    void updateUI(const QString& fileId,const QByteArray& content);
    void paintEvent(QPaintEvent* event);

private:
    QPushButton* imageBtn;

    QString fileId;				//该图片在服务器对应的文件id
    QByteArray content;			//图片的二进制数据
    bool isLeft;
};

#endif // MESSAGESHOWAREA_H
